package pimmodel;

import java.util.List;

/**
 * 
 * Interface IKontakt:<br>
 * Das Interface zur Klasse Kontakt.
 * 
 * @author Thomas Schoenfeld
 * @version (20120909_01)
 *
 */
public interface IKontakt extends IPimDaten, Comparable<IKontakt> {

	/**
	 * addtelefon<br>
	 * Methode um an die Telefonliste der Klasse ein neues Telefonnr-Objekt anzuhaengen.
	 * 
	 * @param	neuTel		das neue Telefonobjekt
	 * 
	 * @throws				IllegalArgumentException falls kein gueltiges Objekt vom Typ ITelefonnr uebergeben wurde
	 */
	public abstract void addTelefonnr(ITelefonnr neuTel);

	/**
	 * getName				gibt den Nachnamen zurueck
	 * 
	 * @return				den Nachname
	 */
	public abstract String getName();

	/**
	 * setName				aendert den Nachnamen
	 * 
	 * @param	name		der neue Nachname
	 */
	public abstract void setName(String name);

	/**
	 * getVorname			gibt den Vornamen zurueck
	 * 
	 * @return				der Vorname
	 */
	public abstract String getVorname();

	/**
	 * setVorname			aendert den Vornamen
	 * 
	 * @param	vorname		der neue Vorname
	 * 
	 * @throws				IllegalArgumentException falls kein gueltiger String uebergeben wurde	
	 */
	public abstract void setVorname(String vorname);

	/**
	 * getEmail				gibt die E-Mail-Adresse zurueck
	 * 
	 * @return				die E-Mail-Adresse
	 */
	public abstract String getEmail();

	/**
	 * setEmail				aendert die E-Mail-Adresse
	 * 
	 * @param	email		die neue E-Mail-Adresse
	 * 
	 * @throws				IllegalArgumentException falls kein gueltiger String uebergeben wurde	
	 */
	public abstract void setEmail(String email);

	/**
	 * getStrasse			gibt den Strassennamen zurueck
	 * 
	 * @return				der Strassenname
	 */
	public abstract String getStrasse();

	/**
	 * setStrasse			aendert den Strassennamen
	 * 
	 * @param	strasse		der neue Strassenname
	 */
	public abstract void setStrasse(String strasse);

	/**
	 * getHausnummer		gibt die Hausnummer zurueck
	 * 
	 * @return				die Hausnummer
	 */
	public abstract String getHausnummer();

	/**
	 * setHausnummer		aendert die Hausnummer
	 * 
	 * @param	hausnummer	die neue Hausnummer
	 */
	public abstract void setHausnummer(String hausnummer);

	/**
	 * getPlz				gibt die Postleitzahl zurueck
	 * 
	 * @return				die Postleitzahl
	 */
	public abstract String getPlz();

	/**
	 * setPlz				aendert die Postleitzahl
	 * 
	 * @param	plz			die neue Postleitzahl
	 */
	public abstract void setPlz(String plz);

	/**
	 * getOrt				gibt den Ort zurueck
	 * 
	 * @return				der Ort
	 */
	public abstract String getOrt();

	/**
	 * setOrt				aendert den Ort
	 * 
	 * @param	ort			der neue Ort
	 */
	public abstract void setOrt(String ort);

	/**
	 * getLand				gibt das Land zurueck
	 * 
	 * @return				das Land
	 */
	public abstract String getLand();

	/**
	 * setLand				aendert das Land
	 * 
	 * @param	land		das neue Land
	 */
	public abstract void setLand(String land);

	/**
	 * getAdresse			gibt die Adresse zurueck
	 * 
	 * @return				die Adresse
	 */
	public abstract IAdresse getAdresse();

	/**
	 * setAdresse			aendert die Adresse (tiefe Kopie)
	 * 
	 * @param	adresse		die neue Adresse
	 * 
	 * @throws				IllegalArgumentException falls kein gueltiges Objekt vom Typ IAdresse uebergeben wurde
	 */
	public abstract void setAdresse(IAdresse adresse);

	/**
	 * getTelefonnummern	gibt Liste der Telefonnummern zurueck
	 * 
	 * @return				die Telefonnummernliste
	 */
	public abstract List<ITelefonnr> getTelefonnummern();

	/**
	 * setTelefonnummern	macht tiefe Kopie einer Telefonliste
	 * 
	 * @param	telefonnr	die neue Telefonnummernliste
	 * 
	 * @throws				NullPointerException falls das uebergebene Objekt null ist
	 */
	public abstract void setTelefonnummern(List<ITelefonnr> telefonnr);
	
	/**
	 * setTelefonnummernneu	ersetzt die aktuelle Telefonliste
	 * 
	 * @param	telefonnr	die neue Telefonnummernliste
	 * 
	 * @throws				NullPointerException falls das uebergebene Objekt null ist
	 */
	public abstract void setTelefonnummernneu(List<ITelefonnr> telefonnr);

	/**
	 * toString					gibt Objektbeschreibung als String zurueck
	 * 
	 * @return					die Objektbeschreibung als String
	 */
	public abstract String toString();

	/**
	 * hashCode					liefert den Hashcode des Objekts als Integer zurueck
	 * 
	 * @return					den Hashcode des Objekts
	 * 
	 * @overrides				hashCode()
	 */
	public abstract int hashCode();

	/**
	 * equals					untersucht das Objekt mit einem uebergebenen Objekt auf Gleichheit
	 * 
	 * @param	obj				das mit diesem Objekt zu vergleichende Objekt
	 * 
	 * @return					true bei Gleichheit, sonst false
	 * 
	 * @overrides				equals()
	 */
	public abstract boolean equals(Object obj);

	/**
	 * compareTo		erlaubt einen lexikographischen Groessenvergleich mit einem anderen Kontakt
	 * 
	 * @param	kontakt	der zu vergleichende Kontakt
	 * 
	 * @return			-1, falls der aktuelle Kontakt lexikographisch kleiner,<br>
	 * 				 	 1, falls er groesser und<br>
	 * 				 	 0, gleich dem uebergebenen Kontakt ist
	 * 
	 * @throws			IllegalArgumentException falls das uebergebene Objekt nicht vom Typ IKontakt ist.
	 */
	public abstract int compareTo(IKontakt kontakt);

}